home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 2: CDPD 1
/
Almathera Ten on Ten - Disc 2: CDPD 1.iso
/
pd
/
351-375
/
362
/
puzz
/
source
/
main.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-14
|
5KB
|
227 lines
/* Declarations for CBACK */
extern BPTR _Backstdout; /* std output when run in background */
long _BackGroundIO = 1; /* Flag to tell it we want to do I/O */
long _stack = 4000; /* Amount of stack space task needs */
char *_procname = "PUZZ"; /* The name of the task to create */
long _priority = 1; /* The priority to run us at */
struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;
int sqrsacross,sqrsdown;
unsigned char start [MAXACROSS] [MAXDOWN];
unsigned char goal [MAXACROSS] [MAXDOWN];
unsigned char grid [MAXACROSS] [MAXDOWN];
unsigned char movelist [MAXPIECES] [4];
int topleftx,toplefty;
int sqrwidth,sqrheight;
int slide;
int moves;
int dmapwidth,dmapheight;
int audio;
BitMapHeader bmhd;
struct RastPort *dbuff;
struct TextAttr MyFont =
{
(STRPTR)"topaz.font",
TOPAZ_EIGHTY, 0, 0
};
extern struct Screen *loadpuzzle(int, char **);
extern struct RastPort *getbuffs(int,int);
extern int get_audio(void);
extern void StopVoices(void);
extern void freebuffs(int,int);
extern void Expand(struct Screen *, BitMapHeader *);
extern void saveundermenu(struct RastPort *);
extern void drawovermenu(struct RastPort *);
extern void print(char *s);
extern struct Menu MyMenu;
void cleanup(int,struct Screen *, struct Window *);
void startpuzzle(struct Screen *,struct Window *);
extern void clicked(struct RastPort *,int,int);
/* following stuff so we can work from CLI or WorkBench */
int runningfromcli;
#define MAXARGS 32
/* Using _main() and cback.o avoids the stupid console
window opening when we are run from the Workbench
*/
void _main(char *cmd)
{
int argc = 0;
char *argv[MAXARGS];
struct Screen *screen;
struct Window *window;
struct NewWindow nw;
struct IntuiMessage *msg;
/* This code fragment gets argc and argv as if from main() */
if (cmd && *cmd)
{
argv[argc] = strtok(cmd,", \n");
while(argv[argc])
argv[++argc] = strtok(NULL,", \n");
}
runningfromcli = (argc == 0 ? 0 : 1);
if (runningfromcli) /* Output my banner. */
{
print("\n\2330;33mPUZZ V1.0\2330m by\t\2331mMartin Round.\2330m\n");
print("\t\t17, Naseby Drive, Halesowen, West Mids.\n");
print("\t\tB63 1HJ England. Contact me through\n");
print("\t\tthe Plug 'Ole B.B. (021-472-0256) or\n");
print("\t\tAMLINK B.B. (021-778-5868).\n\n");
}
IntuitionBase=(struct IntuitionBase *)OpenLibrary("intuition.library",0L);
GfxBase=(struct GfxBase *)OpenLibrary("graphics.library",0L);
screen=loadpuzzle(argc,argv); /* loads puzzle data and then */
/* reads pic into compr. buffer */
/* returns pointer to opened */
/* screen, or NULL for failure */
SetTaskPri(FindTask(NULL),0); /* now run at standard priority */
dmapwidth = sqrsacross * sqrwidth;
dmapheight = sqrsdown * sqrheight;
if (screen == NULL)
{
cleanup(0,screen,(window = NULL));
exit(0L);
}
/* get buffers for saving 'menu' part of pic and double-buffering */
if ((dbuff = getbuffs(dmapwidth,dmapheight)) == NULL)
{
cleanup(0,screen,(window = NULL));
exit(0L);
}
/* attempt to get 4 audio channels - if we can't then we will
still run, but without sounds.
*/
audio = get_audio();
setmem(&nw,sizeof(nw),0);
nw.IDCMPFlags=MOUSEBUTTONS|MENUPICK;
nw.Flags=NOCAREREFRESH|BORDERLESS|ACTIVATE;
nw.Screen=screen;
nw.Type=CUSTOMSCREEN;
nw.Height=bmhd.h; nw.Width=bmhd.w;
nw.DetailPen = 1;
nw.BlockPen = 0;
if (!(window=OpenWindow(&nw)))
{
cleanup (1,screen,window);
exit(0L);
}
startpuzzle(screen,window);
SetMenuStrip(window, &MyMenu);
for (;;) /* FOREVER */
{
Wait(1 << window->UserPort->mp_SigBit); /* sleep */
while ((msg = (struct IntuiMessage *)GetMsg(window->UserPort)) != NULL)
{
switch (msg->Class)
{
case MENUPICK:
if (MENUNUM(msg->Code) == 0) /* Start */
{
startpuzzle(screen,window);
ReplyMsg((struct Message *)msg);
}
else if (MENUNUM(msg->Code) == 1) /* Quit */
{
ReplyMsg((struct Message *)msg);
cleanup (3,screen,window);
exit (0L);
}
else
{
drawovermenu(window->RPort);
ReplyMsg((struct Message *)msg);
}
break;
case MOUSEBUTTONS:
if (msg->Code == SELECTDOWN)
{
drawovermenu(window->RPort);
clicked(window->RPort,msg->MouseX,msg->MouseY);
saveundermenu(window->RPort);
}
ReplyMsg((struct Message *)msg);
break;
default:
ReplyMsg((struct Message *)msg);
break;
}
}
}
} /* end of main */
void cleanup(int level,struct Screen *screen,struct Window *window)
{
switch (level)
{
case 3:
if (audio)
{
StopVoices();
clear_audio(0);
}
case 2:
ClearMenuStrip(window);
freebuffs(dmapwidth,dmapheight);
CloseWindow(window);
case 1:
CloseScreen(screen);
case 0:
CloseLibrary((struct Library *) IntuitionBase);
CloseLibrary((struct Library *) GfxBase);
if (_Backstdout) Close(_Backstdout);
break;
}
}
void startpuzzle(struct Screen *screen,struct Window *window)
{
int i,j;
Expand(screen,&bmhd); /* actually draw the piccy */
saveundermenu(window->RPort);
for (j=0; j<sqrsdown; j++)
for (i=0; i<sqrsacross; i++)
grid [i] [j] = start [i] [j];
moves = 0;
for (i=0; i<MAXPIECES; i++)
for (j=0; j<4; j++)
movelist [i] [j] = j+1;
}